package com.jse.jakarta;

import java.io.File;
import java.util.Set;

import com.jse.Jse;
import com.jse.Refs;
import com.jse.web.Web;

import jakarta.servlet.MultipartConfigElement;
import jakarta.servlet.RequestDispatcher;
import jakarta.servlet.ServletContainerInitializer;
import jakarta.servlet.ServletContext;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpSessionEvent;
import jakarta.servlet.http.HttpSessionIdListener;
import jakarta.servlet.http.HttpSessionListener;

public class WebInitializer implements ServletContainerInitializer,HttpSessionListener,HttpSessionIdListener {
	
	public static RequestDispatcher defaultDispatcher;

	@Override
	public void onStartup(Set<Class<?>> c, ServletContext ctx) throws ServletException {
		if (ctx.getClass().getSimpleName().equals("NoPluggabilityServletContext")) {
	    	Web.sc = Refs.getPrivateField(ctx,"sc",ServletContext.class);
	    }else {
	    	Web.sc=ctx;
	    }
	    defaultDispatcher=ctx.getNamedDispatcher("default");
	    Jse.tempdir=(File)ctx.getAttribute("jakarta.servlet.context.tempdir");
	    if(Jse.tempdir==null)Jse.tempdir=new File(Jse.tmpdir);
		var d=ctx.addServlet("jse",new JseServlet());
		d.setAsyncSupported(true);//异步
		d.setMultipartConfig(new MultipartConfigElement(Jse.tempdir.toString(),
				104857600l,//100m
				524288000l,//500m
				0));
		d.addMapping("/");
		System.out.println("web init");
//		String webapp=ctx.getRealPath("/").replace('\\','/');
//		Jse.webapp=webapp.substring(0,webapp.length()-1);
//		Jse.webapps=webapp.substring(0,Jse.webapp.lastIndexOf('/'));
//		if(Jse.webapps.indexOf("/tomcat")!=-1&&Jse.webapps.endsWith("/web")) {
//			Jse.webapps=Jse.webapps+"apps";
//		}
//		Jse.classpath=webapp+"/WEB-INF/classes";
//		Jse.jspath=Jse.classpath;
		Jse.runing=true;
		Jse.run(getClass());
	}

	@Override
	public void sessionCreated(HttpSessionEvent se) {
		var session=se.getSession();
		Web.SESSIONS.put(session.getId(),session);
	}

	@Override
	public void sessionDestroyed(HttpSessionEvent se) {
		var session=se.getSession();
		Web.SESSIONS.remove(session.getId());
	}

	@Override
	public void sessionIdChanged(HttpSessionEvent se, String oldSessionId) {
		var session=se.getSession();
		Web.SESSIONS.remove(oldSessionId);
		Web.SESSIONS.put(session.getId(),session);
	}

	
}
